我們今天要來寫測試,說到測試,就必須選擇測試使用的套件
Go 的 testing 套件提供了一個健壯的基礎來撰寫測試,而 Testify、GoMock 和 GoCheck 等工具則在此基礎上提供了額外的功能和便利,今天我們會來介紹 Testify
testify提供了一組工具來測試你的程式是否正常運行
斷言(Assertions)在軟體測試中扮演著極為重要的角色。它們用於驗證代碼在特定條件下的行為是否符合預期
assert package
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestSomething(t *testing.T) {
}
所有的測試函數都應該接收一個指向 testing.T 類型的指針作為參數
// assert equality
assert.Equal(t, 123, 123, "they should be equal")
這行檢查兩個數字(123 和 123)是否相等。如果不相等,它將記錄一個錯誤,附帶消息 "they should be equal"
// assert inequality
assert.NotEqual(t, 123, 456, "they should not be equal")
這行檢查兩個數字(123 和 456)是否不相等。如果相等,它將記錄一個錯誤,附帶消息 "they should not be equal"
// assert for nil (good for errors)
assert.Nil(t, object)
這行檢查 object 是否為 nil。如果不是,它將記錄一個錯誤
// assert for not nil (good when you expect something)
if assert.NotNil(t, object) {
// now we know that object isn't nil, we are safe to make
// further assertions without causing any errors
assert.Equal(t, "Something", object.Value)
}
這幾行首先檢查 object 是否不為 nil。如果是 nil,它將記錄一個錯誤。如果不是 nil,則會進入 if 語句的塊中,並進行進一步的斷言。在這個塊中,它檢查 object.Value 是否等於字符串 "Something"。如果不是,它將記錄一個錯誤
模擬可以提供一個穩定、可控的測試環境,減少測試的不確定性和不穩定性
mock package
type MyMockedObject struct{
mock.Mock
}
這裡,MyMockedObject 結構體嵌入了 mock.Mock,這樣 MyMockedObject 的實例就能使用 mock.Mock 的方法來設置期望和返回值
func (m *MyMockedObject) DoSomething(number int) (bool, error) {
args := m.Called(number)
return args.Bool(0), args.Error(1)
}
DoSomething 方法是 MyMockedObject 的一個模擬方法。它使用 m.Called 來記錄方法的調用並返回預設的返回值
Called 方法的定義和用途:Called 方法是在 Testify 的 mock 包中定義的。它用於記錄一個模擬方法的調用,並返回用於設置該方法返回值的 mock.Arguments 對象
在測試函數中,你可以創建模擬對象的實例,並設置它的期望和返回值
testObj := new(MyMockedObject)
testObj.On("DoSomething", 123).Return(true, nil)
這裡,On 方法用於設置當 DoSomething 方法被調用時的期望參數,Return 方法用於設置模擬方法的返回值
testObj.On("DoSomething", mock.Anything).Return(true, nil)
你也可以使用 mock.Anything 作為一個佔位符,表示你期望 DoSomething 方法被調用時接收任何參數